package com.yxm.springbootsecurity.doorchain;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang.StringUtils;
import org.springframework.beans.factory.annotation.Value;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.net.URL;

/**
 * @author CAESAR
 * @Classname ImgFilter
 * @Description 图片防盗链
 * @Date 2019-09-21 14:58
 */
@WebFilter(filterName = "imgFilter", urlPatterns = "/imgs/*") //   拦截请求url中包含imgs的请求
@Slf4j
public class ImgFilter implements Filter {

    @Value("${domain.name}")
    private String domainName;


    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

        //  1. 获取请求中的来源字段
        HttpServletRequest servletRequest = (HttpServletRequest) request;
        String referer = servletRequest.getHeader("Referer");
        //  2.判断请求中的域名是否和限制的域名一致  http://www.caesar.com:8081/index.html
        if (StringUtils.isEmpty(referer) || !checkLegal(referer)) {
            request.getRequestDispatcher("/imgs/error.png").forward(servletRequest,response);
        }

        //   放行请求
          chain.doFilter(servletRequest,response);

    }

    /**
     * 校验请求来源是否合法
     * @param referer  请求来源
     * @return true 为合法   false  为不合法
     */

    private boolean checkLegal(String referer){
        // 将referer处理成域名  比如http://www.caesar.com:8081/index.html  www.caesar.com
        // 黑名单系统  白名单系统都是使用这种方式 但是domainName的来源是配置到数据库里面
        // TODO: 2019-09-21    方法可能待优化
        String host = referer.split("//")[1].split(":")[0];

        if (domainName.equals(host)) {
            return true;
        }
         return false;
    }


    @Override
    public void destroy() {

    }
}
